﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Siser.Web.Models;
using Siser.Web.Models.JsonResponses;
using Siser.Web.Shared;

namespace Siser.Web.Controllers
{ 
    public class EquipoController : Controller
    {
        private SiserEntities db = new SiserEntities();

        //
        // GET: /Equipo/

        public ViewResult Index()
        {
            var equipos = db.Equipos.Include(e => e.Instalacion).Include(e => e.Sistema).Include(e => e.estados_mantenciones);
            return View(equipos.ToList());
        }

        //
        // GET: /Equipo/Details/5

        public ViewResult Details(int id)
        {
            Equipo equipo = db.Equipos.Find(id);
            return View(equipo);
        }

        //
        // GET: /Equipo/Create

        public ActionResult Create()
        {
            ViewBag.InstalacionId = new SelectList(db.Instalaciones, "Id", "Nombre");
            ViewBag.SistemaId = new SelectList(db.Sistemas, "Id", "Nombre");
            ViewBag.EstadoMantencionId = new SelectList(db.EstadosMantenciones, "Id", "Nombre");
            return View();
        } 

        //
        // POST: /Equipo/Create

        [HttpPost]
        public ActionResult Create(Equipo equipo)
        {
            if (ModelState.IsValid)
            {
                db.Equipos.Add(equipo);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            ViewBag.InstalacionId = new SelectList(db.Instalaciones, "Id", "Nombre", equipo.InstalacionId);
            ViewBag.SistemaId = new SelectList(db.Sistemas, "Id", "Nombre", equipo.SistemaId);
            ViewBag.EstadoMantencionId = new SelectList(db.EstadosMantenciones, "Id", "Nombre", equipo.EstadoMantencionId);
            return View(equipo);
        }
        
        //
        // GET: /Equipo/Edit/5
 
        public ActionResult Edit(int id)
        {
            Equipo equipo = db.Equipos.Find(id);
            ViewBag.InstalacionId = new SelectList(db.Instalaciones, "Id", "Nombre", equipo.InstalacionId);
            ViewBag.SistemaId = new SelectList(db.Sistemas, "Id", "Nombre", equipo.SistemaId);
            ViewBag.EstadoMantencionId = new SelectList(db.EstadosMantenciones, "Id", "Nombre", equipo.EstadoMantencionId);
            return View(equipo);
        }

        //
        // POST: /Equipo/Edit/5

        [HttpPost]
        public ActionResult Edit(Equipo equipo)
        {
            if (ModelState.IsValid)
            {
                db.Entry(equipo).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.InstalacionId = new SelectList(db.Instalaciones, "Id", "Nombre", equipo.InstalacionId);
            ViewBag.SistemaId = new SelectList(db.Sistemas, "Id", "Nombre", equipo.SistemaId);
            ViewBag.EstadoMantencionId = new SelectList(db.EstadosMantenciones, "Id", "Nombre", equipo.EstadoMantencionId);
            return View(equipo);
        }

        //
        // GET: /Equipo/Delete/5
 
        public ActionResult Delete(int id)
        {
            Equipo equipo = db.Equipos.Find(id);
            return View(equipo);
        }

        //
        // POST: /Equipo/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            //verifica que no tenga asociado una pieza.
            var listaEquipoPie = (from ep in db.EquiposPiezas
                                    join e in db.Equipos on ep.EquipoId equals e.Id
                                    where e.Id == id
                                    select ep).ToList();
            var usuarioEquipo = (from ue in db.UsuariosEquipos
                                 join e in db.Equipos on ue.EquipoId equals e.Id
                                 where e.Id == id
                                 select ue.Id).ToList();

            if (listaEquipoPie.Count == 0)//si no tiene equipo-Pieza asociada se procede a eliminar.
            {
                Equipo equipo = db.Equipos.Find(id);
                foreach (int val in usuarioEquipo)
                {
                    UsuarioEquipo usua = db.UsuariosEquipos.Find(val);
                    db.UsuariosEquipos.Remove(usua);
                    db.SaveChanges();
                }   
                db.Equipos.Remove(equipo);               
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            else //si tiene equipo asociado se envia mensaje.
            {
                TempData["texto4"] = "Debe eliminar la asociación entre Equipo-Pieza para eliminar el Equipo.";
                return View("Delete");
            }
            
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        public ActionResult Search(string equipo, int? region = null, int? empresa = null, int? planta = null, int? instalacion = null)
        {
            ViewBag.region = new SelectList(db.Regiones, "Id", "Nombre");
            ViewBag.empresa = new SelectList(db.Empresas, "Id", "Nombre");
            ViewBag.planta = new SelectList(db.Plantas, "Id", "Nombre");
            ViewBag.instalacion = new SelectList(db.Instalaciones, "Id", "Nombre");

            List<Equipo> query = null;

            if (equipo != "" && equipo != null)
            {
                query = (from e in db.Equipos
                         join ue in db.UsuariosEquipos on e.Id equals ue.Equipo.Id
                         join u in db.Usuarios on ue.Usuario.Id equals u.Id
                         where e.Nombre == equipo
                             && e.Vigencia == true
                             && u.Vigencia == true
                             && u.Nombre == HttpContext.User.Identity.Name
                         select e).ToList();
            }
            else
            {
                query = (from e in db.Equipos
                         join ue in db.UsuariosEquipos on e.Id equals ue.Equipo.Id
                         join u in db.Usuarios on ue.Usuario.Id equals u.Id
                         where (e.Instalacion.Id == instalacion || instalacion == null)
                             && (e.Instalacion.Planta.Id == planta || planta == null)
                             && (e.Instalacion.Planta.Region.Id == region || region == null)
                             && (e.Instalacion.Planta.Empresa.Id == empresa || empresa == null)
                             && e.Vigencia == true
                             && u.Vigencia == true
                             && u.Nombre == HttpContext.User.Identity.Name
                         select e).ToList();
            }

            return View(query);
        }

        public ActionResult FichaMonitoreo(int id)
        {
            var equipo = (from e in db.Equipos
                          join ep in db.EquiposPiezas on e.Id equals ep.EquipoId
                          join p in db.Piezas on ep.PiezaId equals p.Id
                          join tp in db.TiposPiezas on p.TipoPiezaId equals tp.Id
                          join m in db.Mediciones on p.Id equals m.PiezaId
                          where e.Vigencia == true
                             && ep.FechaFin == null
                             && tp.Nombre == "Detector"
                             && e.Id == id
                          orderby m.Fecha descending
                          select e).FirstOrDefault();

            return View(equipo);
        }

        //[HttpPost]
        public JsonResult GetMediciones(int id)
        {
            DateTime fechaInicio = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
            DateTime fechaFin = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59);

            var medicionesJson = from e in db.Equipos
                                 join ep in db.EquiposPiezas on e.Id equals ep.EquipoId
                                 join p in db.Piezas on ep.PiezaId equals p.Id
                                 join tp in db.TiposPiezas on p.TipoPiezaId equals tp.Id
                                 join m in db.Mediciones on p.Id equals m.PiezaId
                                 where e.Vigencia == true
                                    && ep.FechaFin == null
                                    && tp.Nombre == "Detector"
                                    && e.Id == id
                                    && m.Fecha >= fechaInicio
                                    && m.Fecha <= fechaFin
                                 orderby m.Fecha ascending
                                 select new
                                 {
                                     Fecha = m.Fecha,
                                     Valor = m.Valor
                                 };

            return Json(medicionesJson, JsonRequestBehavior.AllowGet);
        }

        [HttpPost]
        public JsonResult GetEquipos(int instalacionId)
        {
            var JsonEquipos = (from e in db.Equipos
                               join ue in db.UsuariosEquipos on e.Id equals ue.Equipo.Id
                               join u in db.Usuarios on ue.Usuario.Id equals u.Id
                               where e.Vigencia == true
                                  && u.Vigencia == true
                                  && u.Nombre == HttpContext.User.Identity.Name
                                  && e.InstalacionId == instalacionId
                               select new JsonDataEquipo
                               {
                                   Id = e.Id,
                                   Nombre = e.Nombre,
                                   NivelAlarma = "",
                               }).ToList();

            for (int i = 0; i < JsonEquipos.Count; i++)
            {
                int? equipoId = JsonEquipos[i].Id;
                JsonEquipos[i].NivelAlarma = SystemAlarm.GetAlarmLevelByEquipo(HttpContext.User.Identity.Name, JsonEquipos[i].Id);
                JsonEquipos[i].Id = null;
                JsonEquipos[i].Piezas = (from p in db.Piezas
                                         join ep in db.EquiposPiezas on p.Id equals ep.PiezaId
                                         where ep.EquipoId == equipoId
                                            && ep.FechaFin == null
                                            && p.Vigencia == true
                                            && p.TipoPieza.Nombre == "Detector"
                                         select new JsonDataPieza
                                         {
                                             Id = p.Id,
                                             Nombre = p.Nombre,
                                             NivelAlarma = "",
                                         }).ToList();

                for (int j = 0; j < JsonEquipos[i].Piezas.Count; j++)
                {
                    JsonEquipos[i].Piezas[j].NivelAlarma = SystemAlarm.GetAlarmLevelByDetector(HttpContext.User.Identity.Name, JsonEquipos[i].Piezas[j].Id);
                    JsonEquipos[i].Piezas[j].Id = null;
                }
            }

            return Json(JsonEquipos);
        }
    }
}